Thread執行緒,往往在執行耗時程序的時候會使用到,若都由主執行緒來執行,可能會導致阻塞很久無法繼續運作,多執行緒的能力還是有效提高了程式執行的效率及使用者體驗,但通常還是盡量減少執行緒的數量,因為還是會些微影響系統的速度及記憶體空間,那麼首先先進入到java的執行緒。
因為android在執行緒中修改ui的話是不被允許的,但可以透過Looper、runOnUiThread在執行緒中更新你的ui。
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        Looper.prepare();
        Toast.makeText(getApplicationContext(),"abc",Toast.LENGTH_SHORT).show();
        Looper.loop();
//        runOnUiThread(()->{
//            Toast.makeText(getApplicationContext(),"cba",Toast.LENGTH_SHORT).show();
//        });
    }
});
//執行緒開始
thread.start();
//isAlive 判斷目前執行緒是否執行中
Log.d("Thread",""+thread.isAlive());
        //當有多個執行緒時,使用join會有中斷問題(InterruptedException)
//        try {
//            thread.join();
//            ...join
//        } catch (InterruptedException e) {
//            e.printStackTrace();
//        }
與Thread一樣也會去實作Runnable的run方法運行,也有wait與notify的方法,我自己是比較常用到以下的兩種執行handler的寫法:
        //Handler
        Handler handler = new Handler();
        //無延遲執行
        handler.post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(),"handler1!",Toast.LENGTH_SHORT).show();
            }
        });
        //延遲1秒執行
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(),"handler2!",Toast.LENGTH_SHORT).show();
            }
        },1000);
而另外也有許多會用到message的方法,如果想了解更多的可以點這邊:Android Developers
Coroutines(協程),與Thread類似,比較不同的是:協程是協作式處理,線程Thread是搶佔式處理,協程可透過其他協程的調用來進行轉換(會保持狀態),以此來並行運作,大約有runBlocking,coroutineScope,withContext等
,另外也有asyncTask能用來處理耗時任務,接著就簡單的進行使用:
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        //runBlocking(阻塞的coroutine)
        runBlocking {
            //launch為內部、順序執行
            launch{
                Log.d("LOGTAG","runBlocking1")
            }
            launch{
                Log.d("LOGTAG","runBlocking2")
            }
        }
        //coroutineScope launch(內部新增一個協程,順序執行)
        GlobalScope.launch {
            Log.d("LOGTAG","GlobalScope")
        }
        //Dispatchers.Main=主線程執行
        CoroutineScope(Dispatchers.Main).launch{
            Log.d("LOGTAG","CoroutineScope")
        }
        //Dispatchers.Default=預設(不會跑在主線程)
        CoroutineScope(Dispatchers.Default).launch {
            abc()
        }
    }
}
//withContext可切換Dispatcher
suspend fun abc() = withContext(Dispatchers.Default) {
    Log.d("LOGTAG","withContext")
}
假如這些coroutines的關鍵字是紅字的話,可能需要在gradle內加入coroutines的依賴:
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0"
